package tsb.sax;

import java.util.Stack;
import tsb.util.StrOp;

/**
 *
 * todo elemento que empieza debe terminar
 */
public class ControladorEquilibrio {
    private Stack<String> stack;
    private boolean esUsado;
    private int root;

    public ControladorEquilibrio() {
        this.stack   = new Stack<String>();
        this.esUsado = false;
    }

    public void add(final String tagLeido, int clasificacionTag) {
        String tag = tagLeido.toLowerCase();

        if (!esUsado) {
            esUsado = true;
        }

        switch (clasificacionTag) {
            case Clasificador.TAG_INICIO:
                stack.push(tag);
                break;
            case Clasificador.TAG_AUTOCONTENIDO:
                break;
            case Clasificador.TAG_FINAL:
                if (comprobar(tag)) {
                    stack.pop();
                    if (stack.isEmpty()) {
                        root++;
                    }
                }
                break;
        }
    }

    public void clear() {
        this.stack.clear();
        esUsado = false;
    }

    public String getCausaError() {
        String causa = "";

        if (!stack.isEmpty()) {
            causa = "El XML no está balanceado\n";
        }

        if (!this.esUsado) {
            causa += "El XML no tiene elementos\n";
        }

        if (root != 1) {
            causa += "Número incorrecto de los elementos root";
        }
        return causa;
    }

    public boolean esValido() {
        return stack.empty() && this.esUsado && root == 1;
    }

    private boolean comprobar(String tag) {
        String ultimo = StrOp.getNombreTag(stack.peek(), "<", ">");
        String actual = StrOp.getNombreTag(tag, "</", ">");
        return ultimo.equals(actual);
    }
}
